﻿Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports SIAVU.Persistencia

Namespace Dominio

    <Serializable()> _
    Public Class Programacion

#Region "Variables"

        Private _ProgramacionID As Long
        Private _Fecha As Date
        Private _Actividades As IList(Of Actividad)
        Private _HistorialActividades As IList(Of HistorialActividad)
        Private _Plazo As Plazo
        Private _FechasVariables As Boolean
        Private _TipoProgramacion As ETipoProgramacion

#End Region

#Region "Propiedades"

        Public Overridable Property Fecha() As Date
            Get
                Return _Fecha
            End Get
            Set(ByVal value As Date)
                _Fecha = value
            End Set
        End Property

        Public Overridable Property ProgramacionID() As Long
            Get
                Return _ProgramacionID
            End Get
            Set(ByVal value As Long)
                _ProgramacionID = value
            End Set
        End Property

        Public Overridable Property Actividades() As IList(Of Actividad)
            Get
                Return _Actividades
            End Get
            Set(ByVal value As IList(Of Actividad))
                _Actividades = value
            End Set
        End Property

        Public Overridable Property HistorialActividades() As IList(Of HistorialActividad)
            Get
                Return _HistorialActividades
            End Get
            Set(ByVal value As IList(Of HistorialActividad))
                _HistorialActividades = value
            End Set
        End Property

        Public Overridable Property Plazo() As Plazo
            Get
                Return _Plazo
            End Get
            Set(ByVal value As Plazo)
                _Plazo = value
            End Set
        End Property

        Public Overridable Property FechasVariables() As Boolean
            Get
                Return _FechasVariables
            End Get
            Set(ByVal value As Boolean)
                _FechasVariables = value
            End Set
        End Property

        Public Overridable Property TipoProgramacion() As ETipoProgramacion
            Get
                Return _TipoProgramacion
            End Get
            Set(ByVal value As ETipoProgramacion)
                _TipoProgramacion = value
            End Set
        End Property

#End Region

#Region "Metodos"

        Public Overridable Function getHistorialActividades() As IList(Of HistorialActividad)
            Dim objProgramacionPersistencia As New ProgramacionPersistencia
            Return objProgramacionPersistencia.getHistorialActividades(Me.ProgramacionID)
        End Function

        Public Overridable Function getHistorialActividadesComoListaActividades() As IList(Of Actividad)
            Dim oListaHistorialActividad As IList(Of HistorialActividad)
            Dim oListaActividades As IList(Of Actividad)
            Dim oActividadAux As Actividad
            Dim objProgramacionPersistencia As New ProgramacionPersistencia
            Dim iContador As Integer = 1

            oListaHistorialActividad = objProgramacionPersistencia.getHistorialActividades(Me.ProgramacionID)
            If (oListaHistorialActividad IsNot Nothing AndAlso oListaHistorialActividad.Count > 0) Then
                '//Convierto la lista de historial en actividades, legible para el control de MiProgramacion
                oListaActividades = New List(Of Actividad)
                For Each oHistorialActividad As HistorialActividad In oListaHistorialActividad
                    Select Case oHistorialActividad.TipoActividad
                        Case ETipoActividad.Posta
                            oActividadAux = New ActividadPosta
                            DirectCast(oActividadAux, ActividadPosta).Posta.PostaID = oHistorialActividad.PostaID
                            DirectCast(oActividadAux, ActividadPosta).GetPosta()
                        Case ETipoActividad.DiaSinProgramar
                            oActividadAux = New ActividadDiaSinProgramar
                        Case ETipoActividad.Guardia
                            oActividadAux = New ActividadGuardia
                        Case ETipoActividad.DiaLibre
                            oActividadAux = New ActividadDiaLibre
                        Case ETipoActividad.DiaOff
                            oActividadAux = New ActividadDiaOff
                        Case Else
                            oActividadAux = New Actividad
                    End Select

                    oActividadAux.ActividadID = iContador
                    oActividadAux.FechaInicio = oHistorialActividad.FechaInicio
                    oActividadAux.FechaFin = oHistorialActividad.FechaFin
                    oActividadAux.Motivo = "<b>Operador: </b>" + oHistorialActividad.UsuarioModificacion.NombreCompleto + "<br/><b>Observación: </b>" + oHistorialActividad.Motivo
                    oActividadAux.EstadoActividad = oHistorialActividad.EstadoActividad
                    oActividadAux.DescripcionResource = "Modificación " + iContador.ToString.Trim

                    oListaActividades.Add(oActividadAux)
                    iContador += 1
                Next
                Return oListaActividades
            Else
                '//Creo una actividad sin nada para que me muestre la descripcion del resource
                oListaActividades = New List(Of Actividad)
                oActividadAux = New Actividad
                oActividadAux.ActividadID = 0
                oActividadAux.FechaInicio = Nothing
                oActividadAux.FechaFin = Nothing
                oActividadAux.Motivo = ""
                oActividadAux.EstadoActividad = EEstadoActividad.Desconocido
                oActividadAux.DescripcionResource = "Sin modificaciones"

                oListaActividades.Add(oActividadAux)
                Return oListaActividades
            End If
        End Function

        Public Overridable Function getActividades() As IList(Of Actividad)
            Dim objProgramacionPersistencia As New ProgramacionPersistencia
            Return objProgramacionPersistencia.getActividades(Me.ProgramacionID)
        End Function

        'Public Overridable Function getActividades(ByRef Session As Object) As IList(Of Actividad)
        '    Dim objProgramacionPersistencia As New ProgramacionPersistencia
        '    Return objProgramacionPersistencia.getActividades(Me.ProgramacionID, Session)
        'End Function

        Public Overridable Function findActividadById(ByVal ActividadId As Long)
            For Each oActividad As Actividad In Me.Actividades
                If oActividad IsNot Nothing Then
                    If oActividad.ActividadID = ActividadId Then
                        Return oActividad
                    End If
                End If
            Next
            Return Nothing
        End Function

        Public Overridable Function findActividadByFecha(ByVal Fecha As Date)
            For Each oActividad As Actividad In Me.Actividades
                If oActividad IsNot Nothing Then
                    If oActividad.FechaInicio.Date = Fecha.Date Then
                        Return oActividad
                    End If
                End If
            Next
            Return Nothing
        End Function

        Public Overridable Sub Actualizar(ByVal oListaActividadesActualizada As IList(Of Actividad), _
                                          ByVal oListaActividadesEliminadas As IList(Of Actividad), _
                                          ByVal eTipoUsuario As ETipoUsuario)

            Try
                '//Si son postas nuevas incremento la cantidad de subscriptos
                For Each oActividadAux As Actividad In oListaActividadesActualizada
                    If Type.GetType("SIAVU.Dominio.ActividadPosta") Is oActividadAux.GetType() AndAlso oActividadAux.ActividadID = 0 Then
                        'DirectCast(oActividadAux, ActividadPosta).GetPosta() //En teoria no hace falta 
                        Select Case eTipoUsuario
                            Case Dominio.ETipoUsuario.Auxiliar
                                DirectCast(oActividadAux, ActividadPosta).Posta.CantidadAuxiliaresSubscriptos += 1
                            Case Dominio.ETipoUsuario.Comisario
                                DirectCast(oActividadAux, ActividadPosta).Posta.CantidadComisariosSubscriptos += 1
                            Case Dominio.ETipoUsuario.JefeCabina
                                DirectCast(oActividadAux, ActividadPosta).Posta.CantidadJefesCabinaSubscriptos += 1
                        End Select
                    End If
                Next

                '//Si son postas eliminadas decremento la cantidad de subscriptos
                If oListaActividadesEliminadas IsNot Nothing Then
                    For Each oActividad As Actividad In oListaActividadesEliminadas
                        If Type.GetType("SIAVU.Dominio.ActividadPosta") Is oActividad.GetType() Then
                            Select Case eTipoUsuario
                                Case Dominio.ETipoUsuario.Auxiliar
                                    DirectCast(oActividad, ActividadPosta).Posta.CantidadAuxiliaresSubscriptos -= 1
                                Case Dominio.ETipoUsuario.Comisario
                                    DirectCast(oActividad, ActividadPosta).Posta.CantidadComisariosSubscriptos -= 1
                                Case Dominio.ETipoUsuario.JefeCabina
                                    DirectCast(oActividad, ActividadPosta).Posta.CantidadJefesCabinaSubscriptos -= 1
                            End Select
                        End If
                    Next
                End If

                Me.Actividades = oListaActividadesActualizada

            Catch ex As Exception
                Throw
            End Try
        End Sub

#End Region

    End Class

End Namespace

